package mvc.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;

/**
 * @Author:ChenZhangKun
 * @Date: 2020/11/18 20:18
 */
public class MyInterceptor implements HandlerInterceptor {
    private Long btime;
    /**
     * 在controller之前执行
     *
     * @param request
     * @param response
     * @param handler  被拦截的处理器对象
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        btime=System.currentTimeMillis();
        System.out.println("预处理");
        System.out.println(handler.getClass().getClassLoader());
        // 异常时可以转发到定制页面
        // request.getRequestDispatcher("/defaultError").forward(request,response);
         return true;
        // return false;
    }

    /**
     * 请求完成之后处理完成之后执行的（s视图执行了forward后，就认为请求完成）
     * 一般用于资源回收，程序请求过程中创建了一些对象，在这里删除，把占用的内存回收
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("处理完成了");
        // 第一次由于编译jsp等，会导致消耗时间过长
        System.out.println("共消耗时间"+(System.currentTimeMillis()-btime));
    }

    /**
     * 后处理方法
     * * mvc.handler 被拦截的处理对象myController
     * * ModelAndView nv 处理器方法的返回值
     * * 特点：
     * * 1 在处理器方法执行之后执行
     * * 2 能够获取到处理器方法的返回值ModelAndView 可以修改其数据
     * * 3 主要对原来执行结果做二次修正
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 对执行结果进行调整
        if (modelAndView!=null){
            modelAndView.addObject("date",new Date());

        }
        System.out.println("controller执行完成了");
    }
}
